using B.S.Domain.CangKu;
using B.S.Domain.审计字段;
using B.S.Requst;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace B.S.Infratrctrue
{
    public class BaseRepository<T> : IBaseRepository<T> where T :class
    {
        private readonly SysDbcontext dbcontext;

        public BaseRepository(SysDbcontext dbcontext)
        {
            this.dbcontext = dbcontext;
        }
        public SysDbcontext db
        {
            get { return dbcontext; }
        }


        public async Task<int> Add(T entity)
        {
            
            dbcontext.Set<T>().Add(entity);
            return await dbcontext.SaveChangesAsync();
        }

        

        public async Task<int> AddRange(List<T> values)
        {
            dbcontext.Set<T>().AddRangeAsync(values);
            return await dbcontext.SaveChangesAsync();
        }

        //public Task<int> BathDele(List<T> values)
        //{
        //    var sa = values.GetType();
        //    var s=sa.GetProperty(values).GetValue(isdele)
        //    foreach (var item in values) 
        //    {
        //        dbcontext.Set<T>().isDel = true;
        //    }
        //    dbcontext.UpdateRange(values);
        //    return dbcontext.SaveChangesAsync();
        //}

        public IQueryable<T> GetAll()
        {
           return  dbcontext.Set<T>().AsQueryable();
        }
        public async Task<T> GetById(int id)
        {
            
            
            return dbcontext.Set<T>().Find(id);


        }
        
        /// <summary>
        /// 根据条件异步查询列表实现
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>符合条件的实体列表</returns>
        public async Task<List<T>> GetListAsync(Func<T, bool> predicate, CancellationToken cancellationToken)
        {
            // 使用异步方法获取数据并应用过滤条件
            // 这里使用ToListAsync需要添加using System.Linq;
            // 由于IQueryable不直接支持Task<List<T>>的转换，我们使用Task.Run来异步执行
            return await Task.Run(() => GetAll().Where(predicate).ToList(), cancellationToken);
        }

        public async Task<int> Update(T entity)
        {
            dbcontext.Set<T>().Update(entity);
            return await dbcontext.SaveChangesAsync();
        }

        public async Task<int> UpdateRange(List<T> values)
        {
            dbcontext.Set<T>().UpdateRange(values);
            return await dbcontext.SaveChangesAsync();
        }
    }
}
